"""Web路由模块

定义主要的页面路由和视图函数。
"""

import os
import logging
from flask import Blueprint, render_template, request, redirect, url_for, flash, current_app
from werkzeug.utils import secure_filename
import pandas as pd

main_bp = Blueprint('main', __name__)
logger = logging.getLogger(__name__)

ALLOWED_EXTENSIONS = {'csv', 'xlsx', 'xls', 'json'}

def allowed_file(filename):
    """检查文件扩展名是否允许"""
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@main_bp.route('/')
def index():
    """主页"""
    try:
        print("DEBUG: Index route called!")
        # 准备统计数据
        stats = {
            'total_analyses': 0,
            'total_datasets': 0,
            'total_reports': 0,
            'active_users': 1
        }
        print(f"DEBUG: Stats prepared: {stats}")
        result = render_template('index.html', stats=stats)
        print("DEBUG: Template rendered successfully")
        return result
    except Exception as e:
        print(f"DEBUG: Error in index route: {e}")
        logger.error(f"主页加载失败: {e}")
        import traceback
        traceback.print_exc()
        return f"<h1>SurveyAnalyzer 测试页面</h1><p>如果您看到这个页面，说明服务器正在正常运行。</p><p>时间: {e}</p>"

@main_bp.route('/upload', methods=['GET', 'POST'])
def upload_file():
    """文件上传页面"""
    if request.method == 'POST':
        # 检查是否有文件
        if 'file' not in request.files:
            flash('没有选择文件', 'error')
            return redirect(request.url)
        
        file = request.files['file']
        
        # 检查文件名
        if file.filename == '':
            flash('没有选择文件', 'error')
            return redirect(request.url)
        
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
            
            try:
                file.save(filepath)
                
                # 验证文件内容
                if filename.endswith('.csv'):
                    df = pd.read_csv(filepath)
                elif filename.endswith(('.xlsx', '.xls')):
                    df = pd.read_excel(filepath)
                elif filename.endswith('.json'):
                    df = pd.read_json(filepath)
                
                # 将文件名存储到会话中
                from flask import session
                session['current_filename'] = filename
                session['file_info'] = {
                    'filename': filename,
                    'rows': len(df),
                    'columns': len(df.columns),
                    'upload_time': pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S')
                }
                
                flash(f'文件上传成功！数据包含 {len(df)} 行，{len(df.columns)} 列', 'success')
                return redirect(url_for('main.analyze', filename=filename))
                
            except Exception as e:
                logger.error(f"文件处理失败: {e}")
                flash(f'文件处理失败: {str(e)}', 'error')
                if os.path.exists(filepath):
                    os.remove(filepath)
        else:
            flash('不支持的文件格式，请上传 CSV、Excel 或 JSON 文件', 'error')
    
    return render_template('upload.html')

@main_bp.route('/analyze')
def analyze():
    """数据分析页面"""
    from flask import session
    
    # 优先使用URL参数，其次使用会话中的文件名
    filename = request.args.get('filename') or session.get('current_filename')
    if not filename:
        flash('请先上传数据文件', 'error')
        return redirect(url_for('main.upload_file'))
    
    filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
    if not os.path.exists(filepath):
        flash('文件不存在，请重新上传', 'error')
        # 清除会话中的无效文件名
        session.pop('current_filename', None)
        session.pop('file_info', None)
        return redirect(url_for('main.upload_file'))
    
    # 更新会话中的当前文件名
    session['current_filename'] = filename
    
    try:
        # 读取数据
        if filename.endswith('.csv'):
            df = pd.read_csv(filepath)
        elif filename.endswith(('.xlsx', '.xls')):
            df = pd.read_excel(filepath)
        elif filename.endswith('.json'):
            df = pd.read_json(filepath)
        
        # 基本信息
        data_info = {
            'filename': filename,
            'shape': df.shape,
            'columns': df.columns.tolist(),
            'dtypes': df.dtypes.to_dict(),
            'missing_values': df.isnull().sum().to_dict(),
            'numeric_columns': df.select_dtypes(include=['number']).columns.tolist(),
            'categorical_columns': df.select_dtypes(include=['object']).columns.tolist()
        }
        
        # 数据预览
        data_preview = df.head(10).to_dict('records')
        
        return render_template('analyze.html', 
                             data_info=data_info, 
                             data_preview=data_preview)
        
    except Exception as e:
        logger.error(f"数据分析页面加载失败: {e}")
        flash(f'数据加载失败: {str(e)}', 'error')
        return redirect(url_for('main.upload_file'))

@main_bp.route('/visualize')
def visualize():
    """数据可视化页面"""
    from flask import session
    
    # 优先使用URL参数，其次使用会话中的文件名
    filename = request.args.get('filename') or session.get('current_filename')
    if not filename:
        flash('请先上传数据文件', 'error')
        return redirect(url_for('main.upload_file'))
    
    # 检查文件是否存在
    filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
    if not os.path.exists(filepath):
        flash('文件不存在，请重新上传', 'error')
        session.pop('current_filename', None)
        session.pop('file_info', None)
        return redirect(url_for('main.upload_file'))
    
    # 更新会话中的当前文件名
    session['current_filename'] = filename
    return render_template('visualize.html', filename=filename)

@main_bp.route('/cluster')
def cluster():
    """聚类分析页面"""
    from flask import session
    
    # 优先使用URL参数，其次使用会话中的文件名
    filename = request.args.get('filename') or session.get('current_filename')
    if not filename:
        flash('请先上传数据文件', 'error')
        return redirect(url_for('main.upload_file'))
    
    # 检查文件是否存在
    filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
    if not os.path.exists(filepath):
        flash('文件不存在，请重新上传', 'error')
        session.pop('current_filename', None)
        session.pop('file_info', None)
        return redirect(url_for('main.upload_file'))
    
    # 更新会话中的当前文件名
    session['current_filename'] = filename
    return render_template('cluster.html', filename=filename)

@main_bp.route('/ai_analysis')
def ai_analysis():
    """AI智能分析页面"""
    from flask import session
    
    # 优先使用URL参数，其次使用会话中的文件名
    filename = request.args.get('filename') or session.get('current_filename')
    if not filename:
        flash('请先上传数据文件', 'error')
        return redirect(url_for('main.upload_file'))
    
    # 检查文件是否存在
    filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
    if not os.path.exists(filepath):
        flash('文件不存在，请重新上传', 'error')
        session.pop('current_filename', None)
        session.pop('file_info', None)
        return redirect(url_for('main.upload_file'))
    
    # 更新会话中的当前文件名
    session['current_filename'] = filename
    return render_template('ai_analysis.html', filename=filename)

@main_bp.route('/advanced')
def advanced():
    """高级分析页面"""
    from flask import session
    
    # 优先使用URL参数，其次使用会话中的文件名
    filename = request.args.get('filename') or session.get('current_filename')
    if not filename:
        flash('请先上传数据文件', 'error')
        return redirect(url_for('main.upload_file'))
    
    # 检查文件是否存在
    filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
    if not os.path.exists(filepath):
        flash('文件不存在，请重新上传', 'error')
        session.pop('current_filename', None)
        session.pop('file_info', None)
        return redirect(url_for('main.upload_file'))
    
    # 更新会话中的当前文件名
    session['current_filename'] = filename
    return render_template('advanced.html', filename=filename)

@main_bp.route('/reports')
def reports():
    """报告页面"""
    from flask import session
    
    # 优先使用URL参数，其次使用会话中的文件名
    filename = request.args.get('filename') or session.get('current_filename', '')
    
    # 如果有文件名，检查文件是否存在
    if filename:
        filepath = os.path.join(current_app.config['UPLOAD_FOLDER'], filename)
        if not os.path.exists(filepath):
            flash('文件不存在，请重新上传', 'error')
            session.pop('current_filename', None)
            session.pop('file_info', None)
            filename = ''
        else:
            # 更新会话中的当前文件名
            session['current_filename'] = filename
    
    return render_template('reports.html', filename=filename)

@main_bp.route('/help')
def help_page():
    """帮助页面"""
    return render_template('help.html')

@main_bp.route('/about')
def about():
    """关于页面"""
    return render_template('about.html')

# 错误页面模板
@main_bp.app_errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

@main_bp.app_errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500